package com.shuai.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.shuai.dao.ProjectDao;
import com.shuai.dao.SubProjectDao;
import com.shuai.dao.TaskDao;
import com.shuai.model.vo.SubProjectVO;
import com.shuai.model.vo.TaskVO;
import com.shuai.service.TaskService;
import com.shuai.utils.PageUtil;
import com.shuai.utils.R;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;

@Service
public class TaskServiceImpl implements TaskService {

    @Resource
    private TaskDao taskDao;
    @Autowired
    private SubProjectDao subProjectDao;
    @Resource
    private ProjectDao projectDao;

    @Override
    public R taskList(Map<String, Object> params) {
        params = PageUtil.page(params);
        Map<String, Object> res = this.taskDao.totalSize(params);
        List<TaskVO> taskVOS = this.taskDao.taskList(params);
        res.put("taskList", taskVOS);
        return R.ok(res);
    }

    @Override
    public R allPropOfTask(TaskVO vo) {
        Map<String, Object> res = this.taskDao.allPropOfTask(vo);
        return R.ok(res);
    }

    @Override
    public R addTask(TaskVO vo) {
        LambdaQueryWrapper<TaskVO> taskVOLambdaQueryWrapper = new LambdaQueryWrapper<>();
        taskVOLambdaQueryWrapper.eq(TaskVO::getTaskName, vo.getTaskName()).eq(TaskVO::getSubProjectId, vo.getSubProjectId());
        TaskVO taskVO = this.taskDao.selectOne(taskVOLambdaQueryWrapper);
        if (taskVO != null) {
            return R.checkTaskNameError();
        }
        vo.setIntime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        int row = this.taskDao.insert(vo);
        return row > 0 ? R.ok() : R.er();
    }

    @Override
    public R updateTaskCompletion(Map<String, Object> params) {
        int taskId = (int) params.get("taskId");
        int subProjectId = (int) params.get("subProjectId");
        int projectId = (int) params.get("projectId");
        double taskCompletion = Double.parseDouble(params.get("taskCompletion").toString());
        //修改任务进度
        LambdaUpdateWrapper<TaskVO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(TaskVO::getTaskCompletion, taskCompletion).eq(TaskVO::getTaskId, taskId);
        this.taskDao.update(updateWrapper);

        //修改当前任务所在子项目的子项目的进度
        //TODO 根据任务的id获取所在子项目的所有人未删除任务，做乘法并更新  比重 * 进度
        this.subProjectDao.updateSubProjectTaskCompletion(subProjectId);
        //修改该子项目所在项目的项目进度
        int row = this.projectDao.updateTaskCompletion(projectId);
        return row > 0 ? R.ok() : R.er();
    }

    @Override
    public R updateTask(TaskVO vo) {
        int i = this.taskDao.updateTask(vo);
        if (vo.getProp() != null) {
            //重新分配比重，需要重新计算进度
            TaskVO taskVO = this.taskDao.selectById(vo.getTaskId());

            //TODO 根据任务的id获取所在子项目的所有人未删除任务，做乘法并更新  比重 * 进度
            this.subProjectDao.updateSubProjectTaskCompletion(taskVO.getSubProjectId());
            SubProjectVO subProjectVO = this.subProjectDao.selectById(taskVO.getSubProjectId());
            //修改该子项目所在项目的项目进度
            this.projectDao.updateTaskCompletion(subProjectVO.getProjectId());

        }
        return i > 0 ? R.ok() : R.er();
    }

    @Override
    public R delTask(TaskVO vo) {
        LambdaUpdateWrapper<TaskVO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(TaskVO::getDelflag, 1).eq(TaskVO::getTaskId, vo.getTaskId());
        int i = this.taskDao.update(updateWrapper);
        if (i > 0) {
            TaskVO taskVO = this.taskDao.selectById(vo.getTaskId());
            //TODO 根据任务的id获取所在子项目的所有人未删除任务，做乘法并更新  比重 * 进度
            this.subProjectDao.updateSubProjectTaskCompletion(taskVO.getSubProjectId());
            SubProjectVO subProjectVO = this.subProjectDao.selectById(taskVO.getSubProjectId());
            //修改该子项目所在项目的项目进度
            this.projectDao.updateTaskCompletion(subProjectVO.getProjectId());
        }
        return i > 0 ? R.ok() : R.er();
    }


}
